{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorFlow2教程-自编码器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://upload.wikimedia.org/wikipedia/commons/2/28/Autoencoder_structure.png)\n",
    "\n",
    "自动编码器的两个主要组成部分; 编码器和解码器\n",
    "编码器将输入压缩成一小组“编码”（通常，编码器输出的维数远小于编码器输入）\n",
    "解码器然后将编码器输出扩展为与编码器输入具有相同维度的输出\n",
    "换句话说，自动编码器旨在“重建”输入，同时学习数据的有限表示（即“编码”）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  1.导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import tensorflow.keras as keras\n",
    "import tensorflow.keras.layers as layers\n",
    "from IPython.display import SVG\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 784)   (60000,)\n",
      "(10000, 784)   (10000,)\n"
     ]
    }
   ],
   "source": [
    "x_train = x_train.reshape((-1, 28*28)) / 255.0\n",
    "x_test = x_test.reshape((-1, 28*28)) / 255.0\n",
    "\n",
    "print(x_train.shape, ' ', y_train.shape)\n",
    "print(x_test.shape, ' ', y_test.shape)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.简单的自编码器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "inputs (InputLayer)          [(None, 784)]             0         \n",
      "_________________________________________________________________\n",
      "code (Dense)                 (None, 32)                25120     \n",
      "_________________________________________________________________\n",
      "outputs (Dense)              (None, 784)               25872     \n",
      "=================================================================\n",
      "Total params: 50,992\n",
      "Trainable params: 50,992\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "code_dim = 32\n",
    "inputs = layers.Input(shape=(x_train.shape[1],), name='inputs')\n",
    "code = layers.Dense(code_dim, activation='relu', name='code')(inputs)\n",
    "outputs = layers.Dense(x_train.shape[1], activation='softmax', name='outputs')(code)\n",
    "\n",
    "auto_encoder = keras.Model(inputs, outputs)\n",
    "auto_encoder.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.utils.plot_model(auto_encoder, show_shapes=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "encoder = keras.Model(inputs,code)\n",
    "keras.utils.plot_model(encoder, show_shapes=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWwAAAC4CAIAAABIJUFjAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO2deVhTV/r43wRxYREQHjZBlhRFUHGso6OijgsgFUVbZVEsVURlqsjyDVDXcQFRASmgM44UqxYULLZK0aqodStW69KpWIwjmwUBEQSJbCH398d5en+3AWKSG5Ko7+evnPeee+57Lue+nO19D4eiKEAQBFEUrroVQBDkzQaNCIIgrEAjgiAIK9CIIAjCij7MRFlZ2WeffdbZ2akubRAE0XC0tLR27Nhha2tLS/7UE7l58+axY8dUrRSiVgoLCwsLC9WtRa/w5MmT48ePq1uLt41jx47dvHmTKenTNVNOTo6q9EHUj4+PD7ylf/ScnBxfX9+3smpqhMPhSEhwTgRBEFagEUEQhBVoRBAEYQUaEQRBWIFGBEEQVqARQRCEFWhEEEUYP348n89XtxZKg8PhcLncqKio+Ph4gUBAywUCQUJCQnZ2touLC4fDcXZ2fvXqFX21oKDAw8ODw+GMHTs2Oztb9WoXFRV5e3sbGxubmJj4+flVVVUROUVR6enpo0eP1tPTc3FxycjIIM76IpEoKirq999/p0sQCATx8fFr1qzhcDhd125lhWJAXgSFvEssXLhw4cKF8t7l6+u7YcOG3tCHUFFRwb4Q2dszAPB4PAnhpUuX/P3929raKIpqbGwk30twcDAzT2lpKQAUFxez11ZeioqK5s2bd+LEiTt37gQEBADA9OnTyaXo6OjFixenpaWFhob2798fAFJSUsilurq6+fPnP378WKI0Gxsb2d9Vdnb2nyTMBBqRdxDFjEivUlJS4urqyr4cuYzIsGHDmJKioiJra+u6ujpmnsmTJwPAsWPHaGF7ezsAEEOjYpKTk4VCIa2GgYGBrq4uRVEVFRWLFi2is33//fcSJvLevXvOzs4vX75kljZs2DCFjQgOZxDN4vfff/fy8nr27JkadRCLxQEBAUuXLjU2NmbKs7Ozzc3NV6xYUVJSQiTa2toA0LdvX9UruXbtWh0dHTopEomCgoIAoLy8PDExkZa7u7ubmJjU1tbSEhcXFx6Pp8TRKBoRRD46OztzcnICAwOnTJlCUdTJkydXrFhhZWXV0NAQGBhobGw8YsSIn3/+maKowsLCyMhIW1vb6urqjz76aNCgQSNGjMjNzQWA/fv304PwpqamxMREOvnll18+ePCgurp61apV5IkXL160srK6fPmyyup46tSpu3fvzpo1S0JuYWGRk5MjFAr9/PxIH0SCxsZGPp8fExMTERHh7u4eERHR0NAg5S2Ru1paWnbu3BkUFDR27NiZM2f++uuvcmkrFos3bdqUnJycnJwMAK6urubm5swM7e3tpA9F4+HhceDAgcePH8v1oB5hdktwOPMOosBwpry8HACGDRsmFoufPHmiq6sLANu3by8rKzty5AgAjBs3TiQS5eXlkQH56tWrL1++nJmZqaenBwDXrl2jKMre3p7Z2JhJ+PPg4ttvvx0wYMCpU6fkrZrCwxk/Pz/y7UnkIT+SkpIAIDIyUkLe1NTk4OCwefNmkqypqXFwcLCzs6uvr+/pLZGcy5cv/+2338hvNzc3U1PTxsZGGet44sQJYiBsbW0PHDggFoslMly7dq1///63b99mCu/cuQMAcXFxtITNcAaNyLuOAkZELBYzv7qhQ4fSzUYsFpuamvbt25ckHRwcAKC5uZkk9+zZAwC+vr5Ul1bLTEKXGYqOjg65K8bCiNjY2BgYGHTNQ36IxeIFCxYAQH5+PlO+bt06AKiqqqJvOXToEADw+Xyq57d048aNrv/a8/LyZKxjfX19UVFRamrqgAEDAODgwYPMqx0dHVOmTMnKypK4q7KyEgA8PT1pCc6JICpFYi2QmeRwOEZGRnRXn8vlAgD5JwwAc+fOBYBHjx7J+8Q+fbpxN+89qqurjYyMerrK4XAyMjIcHR0DAwPpVVUAuH79OgDo6+vTkilTpgDAjz/+CD2/pVu3bjk5OUl8qF5eXjKqamRk5OTktHr16v379wPA4cOHmVe3bNkyY8YMf39/ibsMDQ0BoKamRsanSAeNCKI6LC0tAcDa2lrdirwGLS0t6aG59PX1c3NzW1paFi9eTAuJxSwrK6MlZmZmAGBgYCClqOfPn5eWlgqFQqZQgcBg3t7e8Ocp3ry8PF1d3U2bNnXNTCwapaSTHtCIIKrj+fPnADBz5kz4ox23tbUBgFgsJhsx6GYtEomYN0okexsLC4sXL14wJeSrZn7bTk5OGRkZP/zwAy0h/Y78/Hxa8uTJE/ijvj3h6OhIJlZpyYMHD9LS0uTV+enTpwDwwQcfkOS5c+cqKytjYmLoDKRDRGhoaAAACwsLeZ/SLWhEELl5+fIlADQ1NZFka2srML5/crWjo4POT5uACxcujBkzZuXKlQDg6OgIANu3b3/06NHnn39OrMnZs2c7Ozt5PN7Tp08rKirIXd99952hoeGZM2dUUjkAgKlTp758+ZJUhECWSCX6/z4+PmFhYXQyKirK2dk5NTWVfM8AsHfv3okTJ65evRp6fkve3t52dnbbtm0LCgrKzMzcsGFDWFjY0qVLASAhIcHJyeno0aPdKpmUlPTFF18QY9fa2hodHe3j40OeVVBQEB8fLxKJ0tLS0tLSUlNTw8PDT58+Td9bV1cHAK6urmzfFIE5EsOJ1XcQeSdWm5ub6f9viYmJcXFx5Pe2bdtevHhBpk4BIDo6+tWrV2S6bvfu3c+ePaupqdmxYwe9x+nhw4fjxo3T0dFxc3N7+PChq6trQEDA0aNHW1tbY2JizM3Nv/76a5Lz3LlzFhYWFy5ckLdqCk+skv7F2bNnSTI3N9fT0xMAZs+efeXKFeaN7e3tkyZNopNNTU18Pt/NzS0iIoLP52/durW1tZWiKLpn0e1bKi0tnTNnjpGRkZmZWXBwcG1tLSktJCSEw+FYWlp2q/PmzZt5PJ6hoeGqVatCQ0PPnz9PlmauX79OJlklYO5S3bdvH5fLZUpwdQZRnF7dsSp70+wN2OxY9fT0XLt2be/oJQfE1Cq9WC8vr+XLlzMluDqDIGwh4ymagwcP5ufnV1dXq0sfABAKhSkpKenp6cottrCwUCAQMHe1ArtZJ5WunCHvGmTRobm5mWwz02TKyspCQ0MtLS0//PDDoUOHmpmZ5ebmhoeHp6en00vUKqakpCQuLm7gwIFKLLOysjI2NragoIAUKxAITpw4UV9fz2b3KhoRpFdobm6Oi4sjXuehoaHBwcETJkxQt1I9QnW32Dlq1KjY2Ni9e/dGRUWpXiUAGDlypHIL7OjoOHLkSFZWFm2Yhg4dSma4du3apXCxCg5nNCecRGVlZUZGho+Pj+xt9OrVqzExMcRZ4+OPPz558mSvaggAly5dWrhwIXniypUrya6ktxs9PT16V3VGRoYmWxAp2Nvbq8uC9Aba2toxMTHK7dqAwkbEzs6OuEX0EmSBXRYGDx48c+bM48ePk6VvWZg8eXJ8fPyQIUMA4N///jfZpdMb0LWYNm0a2QE9ZMiQ/fv3T5o0qZeeiCCqR0EjcuzYsW3btilXFZrS0tJFixbJnp+YA3khy2BMZ2rlIlEL8qBu194Q5I1G4+ZESDiJN/084LejFggiC3L3RFQfTkIxZA9CoSG1EAgECxYsiI6OXrJkyeTJk//73/8CwFdffaWjo8PhcMgGRADIzMzs27cvGRx1jUPR2dn5ww8/hIWF2draVlZWTp06dciQIbIP9BBEEZibRmTcnKPicBIyboCRuOW1QSjo3TUqq4X0er333nv29vbUH6HunJ2diXz9+vUAcP/+fZIsLy+fN28e+d01DkVtbS29YTEuLu78+fNBQUESgfAk0MDwiMoCN0/2BqCUHauqDychS8W63iI9CIWEAiqohfR6JSYmkrgPnZ2d9vb2ffr0IfK6ujo9Pb2goCCSjIuLI8EmpMShIHV5/vy5lOrTLFy4UGn/kZB3AwkjosicyGvDSdABHbuGkwgPD1cgnIRiyBWEQu21iIiIaG5u3rt3b319fVtbG72D0NjYeM2aNQkJCVu2bLG0tLxw4QJZXCdxKIqKinqqy6BBg2R89IQJE8LDw5VUDw2isLBwz549OTk56lbkrcLHx0dCotKJ1TclnIR0lF6L2tpaIyOju3fv+vr67tu379NPP83MzGRmiIiISElJ2bNnj5+f37hx44hxpONQMPdTdnZ2amlpyauAlZXVW9kfIb2/t7JqGoVKfWcUDiehGL0UhEK5taAo6h//+IeWltbHH3/c0dFBvEXJgJEux8TEJCQkZP/+/SkpKcuWLSNCZcWhQBCWKGJEVBxO4rWQQ8kk1lNfG4SC3EVHlOrtWpA4ei9fviQGgtDY2Lhy5cr+/ftzudynT59WVlaeP38+MzOTBIm4efMmvV0tMjKyvb29oqLivffeIxIpcShIXZqbm2V8gQjCBrmNiFAoJCEknj59mpSUtGPHDrJYExsb29jYmJycTL6WjRs3trS0kFuSk5Pr6upqa2urqqouX75MjurYuXPnuHHjkpKSPv3009mzZzs7OwcEBLx48UIkEi1cuHDgwIG3bt2SRZ9Lly6RwDBlZWW7du26d+8ekffr12/gwIH9+vXresvVq1ejo6PJ97lixYqTJ0/u3bu3V2tx8eLFkJAQAKiqqnJycpo2bdq0adOGDRtmamp64MABNzc3ACCuVuvXr+fxeOvXrzc0NIyLi6P3wpmbm7u5uZGDRQj9+/e/ePHinDlzvvnmm8jIyNra2szMTC0tra1bt5K6RERE3L17V56/LYIoBHOWVelLYuoNJ6EsNKEWzc3NPB6PPvFMieASLyIX8MbFE+H0THFxsbq1Ux179+5ds2ZN723SRxCF6d3VGfbhJCglBaRmgxqDYty4cWPFihWvXr3q7Ox8p4wm8gbRWz2R5ubmdevW0eEkCgsLe+lBvYraa6Grq9vU1MTlcrOysrqd30GUAofD4XK5UVFR8fHxAoGAlgsEgoSEhOzsbBcXFw6H4+zsTObjCQUFBR4eHhwOZ+zYsWTopGKKioq8vb2NjY1NTEz8/PzoQ3AoikpPTx89erSenp6Li0tGRgb5ZywSiaKiokh7JggEgvj4+DVr1tAeG4rAHNvgGPIdpLfnRCoqKtRViFwxVnk8noTw0qVL/v7+bW1tFEWRxXsACA4OZuYpLS0FgOLiYgXUY0lRUdG8efNOnDhx586dgIAAAJg+fTq5FB0dvXjx4rS0tNDQUOK0kZKSQi7V1dXNnz+fGaKZYGNjI/u7wkDNyJ/oVSNSUlLi6uqqrkLYBGouKiqytrauq6tj5iGn3h47dowWklPsiKFRMcnJyfREO/G30tXVpSiqoqJi0aJFdLbvv/9ewkTeu3fP2dlZwqMKAzUjmgiJh/Ds2TO1FyIvYrE4ICBg6dKlxsbGTHl2dra5ufmKFStKSkqIhKz0M8+dUxlr165lTrSLRCKyA6C8vJwZhNnd3d3ExIT24QAAFxcXHo+nxMiEaEQQmWhsbOTz+TExMREREe7u7hERESTCgIzxECjlBVWQPciDwpw6deru3buzZs2SkFtYWOTk5AiFQj8/P/q84de+JarnWBPkrq4hHeTSViwWb9q0KTk5OTk5GQBcXV3Nzc2ZGdrb20kfisbDw+PAgQNsgjP/CWa3BIcz7yCyDGeampocHBw2b95MkjU1NQ4ODnZ2duQLkSUeghKDKrw2yAONwsMZPz8/8u1J5CE/kpKSACAyMlJC3tNbqq+v7ynWBMnZNaRDY2OjLGpTFHXixAliIGxtbQ8cOEDOr2Jy7dq1/v373759mym8c+cOANBBcCk8vAphgyxGZN26dQBQVVVFS0hUJD6fT8kTD0FZQRWkB3mgUdiI2NjYGBgYdM1DfojF4gULFgBAfn4+Uy79LfUUa0JKSAdZqK+vLyoqSk1NJUFkDh48yLza0dExZcoUEmKCSWVlJQB4enrSEpwTQXoXEp5eX1+flpDDq5lnRMtC16AKAKBAUAW5gjwoQHV1tZGRUU9XORxORkaGo6NjYGAgvaoKr3tLXWNNkAERCekg8aF6eXnJqKqRkZGTk9Pq1av3798PAIcPH2Ze3bJly4wZM/z9/SXuMjQ0hC5HCysMGhHk9ZCPv6ysjJaYmZkBgIGBAZtiNTY0hJaWlvT4uPr6+rm5uS0tLYsXL6aFir0lOqQDU6hAdF5yaAFzijcvL09XV3fTpk1dMxOLRilpJycaEeT1kP+o+fn5tIS4L7KMh6BwUIVeCvJAY2FhQRypachXzfy2nZycMjIyyNHfBOlvqSeUFdLh6dOnAPDBBx+Q5Llz5yorK+mj1+HP3UYyKW5hYSHvU7qH2YnCOZF3EFnmRIRCobOz8+DBg+kBf2ho6MSJE8nU47x58wBgw4YNAoEgKSmJDATOnDkjEol4PJ6Ojk55eTm5iwy86RmNQ4cOjRkzRt5CyD/Y06dPv7ZqCs+JkKAtTU1NtIQMWyorKyVuJB7ksrwlspuLnvgkvbD29vaWlhY7OzsAWLZs2VdffbV+/Xo3Nzcysbp79+7hw4d3ndEgJCYmpqenk7ntlpYWb29vHx+fzs5OiqLOnz8/bdq01D9ISUkJCwtbv349fe8vv/wCOLGKKAsZN5s1NTXx+Xw3N7eIiAg+n79169bW1lZyiZxcr6Oj4+bm9vDhQ1dX14CAgKNHj7a2tsbExJibm3/99dckJ2mpu3fvfvbsWU1NzY4dO+gtT7IXcu7cOQsLiwsXLrxWZ4WNCOlfnD17liRzc3NJsKjZs2dfuXKFeWN7e/ukSZNe+5bonsW2bdtevHhBZpQBIDo6+tWrV6WlpXPmzDEyMjIzMwsODq6trSWlhYSEcDgcS0vLbnXevHkzj8czNDRctWpVaGjo+fPniYWiI3VLwNylum/fPi6Xy5SgEUEUR5WhAFQcVIHNjlVPT8+1a9f2jl5yQGyr0ov18vJavnw5U4KrMwjCFjIdQ3Pw4MH8/Pzq6mp16QMAQqEwJSUlPT1ducUWFhYKBALmrlZgN82kcSfgIW8xagyq8FrKyspCQ0MtLS0//PDDoUOHmpmZ5ebmhoeHp6enM0Nhq5KSkhIS706JZVZWVsbGxhYUFJBiBQLBiRMn6uvr2exeRSOCqILm5ua4uDg6qEJwcPCECRPUrdT/h+pusXPUqFGxsbF79+6NiopSvUoAMHLkSOUW2NHRceTIkaysLNowDR06lKzg7Nq1S+Fi0YggqkBPTy8uLo5E532DsLe3V5cF6Q20tbWZi77KAudEEARhBRoRBEFYgUYEQRBWoBFBEIQV3UysHj9+XPV6IOqCrJi8lX904mX/VlZNs2DuPLty5UpvO1kjCPJG06dPH4m9/5xuV8gRhODj4wMAOTk56lYE0VxwTgRBEFagEUEQhBVoRBAEYQUaEQRBWIFGBEEQVqARQRCEFWhEEARhBRoRBEFYgUYEQRBWoBFBEIQVaEQQBGEFGhEEQViBRgRBEFagEUEQhBVoRBAEYQUaEQRBWIFGBEEQVqARQRCEFWhEEARhBRoRBEFYgUYEQRBWoBFBEIQVaEQQBGEFGhEEQViBRgRBEFagEUEQhBVoRBAEYQUaEQRBWIFGBEEQVqARQRCEFWhEEARhBRoRBEFYgUYEQRBW9FG3Aohm0dDQ8MUXX3R2dpJkcXExAOzcuZMktbS0goKCjIyM1KYfonlwKIpStw6IBnHlypWpU6dqa2tzuZK9VLFY3NHRcfny5SlTpqhFN0QzQSOC/AmxWGxubv7s2bNur5qYmFRXV2tpaalYK0STwTkR5E9wudxFixb17du366W+ffsGBASgBUEkQCOCSOLv79/e3t5V3t7e7u/vr3p9EA0HhzNIN9ja2paXl0sIra2ty8vLORyOWlRCNBbsiSDdsGTJEm1tbaZEW1v7k08+QQuCdAV7Ikg3FBcXDx8+XEJ4//59Z2dnteiDaDLYE0G6wdHR0cnJidnvcHJyQguCdAsaEaR7Pv74Y3ohRltbOzAwUL36IBoLDmeQ7nny5ImNjQ1pHhwOp6SkxNbWVt1KIZoI9kSQ7rG2th4/fjyXy+VyuePHj0cLgvQEGhGkR5YsWcLhcLhc7pIlS9StC6K54HAG6ZG6ujpzc3MAqKqqMjU1Vbc6iKZCKQkrKyt1VwVBEFmxsrJS1revtJ4Ih8MJDw+fMGGCUkpDFKOwsHDPnj05OTnKKrClpQUABgwYoKwC2eDj44NtTCmQdqKsb1+Z8UT+9re/LVy4UIkFIvJCmsVb/FfANqYUlGU+CDixiiAIK9CIIAjCCjQiCIKwAo0IgiCsQCOCIAgr0IggCMIKNCIIAMD48eP5fL66tehFBAJBQkJCdna2i4sLh8NxdnZ+9eoVfbWgoMDDw4PD4YwdOzY7O1v16hUVFXl7exsbG5uYmPj5+VVVVRE5RVHp6emjR4/W09NzcXHJyMggq7MikSgqKur3339XvardoKxdawCQnZ2trNIQxSAfgAI3+vr6btiwQen60FRUVLAvROE2dunSJX9//7a2NoqiGhsbScsPDg5m5iktLQWA4uJi9nrKS1FR0bx5806cOHHnzp2AgAAAmD59OrkUHR29ePHitLS00NDQ/v37A0BKSgq5VFdXN3/+/MePHyvwRIXbSbegEXmrUG7jUBYlJSWurq7sy1GsjRUVFVlbW9fV1THLmTx5MgAcO3aMFpLY1MTQqJjk5GShUEirYWBgoKurS1FURUXFokWL6Gzff/89APB4PFpy7949Z2fnly9fyvtE5bYTHM4gvcvvv//u5eXV00E2vY1YLA4ICFi6dKmxsTFTnp2dbW5uvmLFipKSEiIhMWW7PSujt1m7dq2Ojg6dFIlEQUFBAFBeXp6YmEjL3d3dTUxMamtraYmLiwuPx1P7OBSNyLtOZ2dnTk5OYGDglClTKIo6efLkihUrrKysGhoaAgMDjY2NR4wY8fPPP1MUVVhYGBkZaWtrW11d/dFHHw0aNGjEiBG5ubkAsH//fg6HQ8IpNjU1JSYm0skvv/zywYMH1dXVq1atIk+8ePGilZXV5cuXVVC7U6dO3b17d9asWRJyCwuLnJwcoVDo5+fX7fkYjY2NfD4/JiYmIiLC3d09IiKioaFByvshd7W0tOzcuTMoKGjs2LEzZ8789ddf5dJWLBZv2rQpOTk5OTkZAFxdXYkXNU17ezvpQ9F4eHgcOHDg8ePHcj1IySirSwM4nNEAFOumktMhhg0bJhaLnzx5oqurCwDbt28vKys7cuQIAIwbN04kEuXl5ZFh+erVqy9fvpyZmamnpwcA165doyjK3t6e+WhmkhROX/r2228HDBhw6tQpefVUoI35+fkBQHt7u0Q55EdSUhIAREZGSsibmpocHBw2b95MkjU1NQ4ODnZ2dvX19T29H5Jz+fLlv/32G/nt5uZmamra2Ngoo6onTpwgBsLW1vbAgQNisVgiw7Vr1/r373/79m2m8M6dOwAQFxcn41MIOCeC9IhijUMsFjO/86FDh9KFiMViU1PTvn37kqSDgwMANDc3k+SePXsAwNfXl6KoYcOGMR/NTEoYEYqiOjo65FWSUqiN2djYGBgYdC2H/BCLxQsWLACA/Px8pnzdunUAUFVVRd9y6NAhAODz+VTP7+fGjRtd/0nn5eXJqGp9fX1RUVFqairxmT548CDzakdHx5QpU7KysiTuqqysBABPT08Zn0LAORFEyUicJsNMcjgcIyMjusNPTvkm/4oBYO7cuQDw6NEjeZ/Yp48y3celUF1dbWRk1NNVDoeTkZHh6OgYGBhIr6oCwPXr1wFAX1+flpAzzH/88Ufo+f3cunXLyclJ4gPz8vKSUVUjIyMnJ6fVq1fv378fAA4fPsy8umXLlhkzZnQ9gdDQ0BAAampqZHxKb4BGBFEcS0tLALC2tla3Ij2ipaXV2dkpJYO+vn5ubm5LS8vixYtpIbGVZWVltMTMzAwADAwMpBT1/Pnz0tJSoVDIFEp/erd4e3vDn6d48/LydHV1N23a1DUzsWiUWuMTohFBFOf58+cAMHPmTPijNbe1tQGAWCwm2zHoxi0SiZg3SiR7DwsLixcvXjAl5KtmfttOTk4ZGRk//PADLSH9jvz8fFry5MkT+KOmPeHo6EgmVmnJgwcP0tLS5NX56dOnAPDBBx+Q5Llz5yorK2NiYugMpENEaGhoAAALCwt5n6JE0Igg8PLlSwBoamoiydbWVmB8/+RqR0cHnZ82ARcuXBgzZszKlSsBwNHREQC2b9/+6NGjzz//nFiTs2fPdnZ28ni8p0+fVlRUkLu+++47Q0PDM2fOqKBqU6dOffnyJakCgSyRSvT/fXx8wsLC6GRUVJSzs3Nqair5ngFg7969EydOXL16NfT8fry9ve3s7LZt2xYUFJSZmblhw4awsLClS5cCQEJCgpOT09GjR7tVMikp6YsvviDGrrW1NTo62sfHhzyroKAgPj5eJBKlpaWlpaWlpqaGh4efPn2avreurg4AXF1d2b4pNihrcgVwYlUDUGDCrLm5mf4vl5iYGBcXR35v27btxYsXZOoUAKKjo1+9ekWmS3fv3v3s2bOampodO3bQO50ePnw4btw4HR0dNze3hw8furq6BgQEHD16tLW1NSYmxtzc/OuvvyY5z507Z2FhceHCBXlrp0AbI/2Ls2fPkmRubq6npycAzJ49+8qVK8yc7e3tkyZNopNNTU18Pt/NzS0iIoLP52/durW1tZWiKLpn0e37KS0tnTNnjpGRkZmZWXBwcG1tLSktJCSEw+FYWlp2q+TmzZt5PJ6hoeGqVatCQ0PPnz9PlmauX7/ebWBK5i7Vffv2cblcefet4uoM0iO9vWNVYglGxSjWxjw9PdeuXdsb+sgFMbJKL9bLy2v58uXy3oWrMwgiBwcPHszPz6+urlajDkKhMCUlJT09XbnFFhYWCgQC5q5WtYBGBJEDsvTQ3NysbkXkwMzMLDc3Nzw8XGLdRJWUlMZsTiIAAAqJSURBVJTExcWNHDlSiWVWVlbGxsYWFBQMHDhQicUqABoRmTh//rynpyfZyj1t2rRp06aNHTt27ty56enpZAbxrae5uXndunXE9zw0NLSwsFDdGsnBqFGjYmNj9+7dqy4FRo4cqdxPvaOj48iRI1lZWRqxvq6scRH05pyIUhzJWRZCvh9bW1uS7OzsPHnypL29/XvvvXf//n326ikFzfTiVRa92sbeKd65OZHS0tJFixapvZDBgwcDQL9+/UiSy+XOnTv32rVrzc3N3t7e5JAnBHkH0XQjohRH8t7zRrewsNi2bdvjx4/VPrmFIOpCpUakW/dqkNmRnFKeN/qtW7fGjx//6aefbty4sU+fPmS/kGIu6gsWLOByuefOnSPJrs7g1Ov8x7tVhqVTOYKoDmWNi+B149We3KtJmAZZHMmV6I3u4OBgZGREtvT4+PjU1NRQMrioQxdvVIK5ufmgQYPI767O4C9evJDuP96tMoo5leOcCCILym0nKnKmBID4+PhHjx6RLdIAYGpqumHDhsDAwLi4uF27dpG4UjQSSYKWlpaXl5e1tfWjR4/i4+PJZ1lbWxseHp6amjpp0iRZCiE0NDQ0NDSkpKSsWbNm48aNxDB5e3s3NTUp4GDap08f0uX56aef0tPTJbYDXL161cvLa/DgwQKBYP369QAwZMiQyMjIe/fu9aRMt+VcuXJFRpfQ48ePy1uFN4UbN25I+BwjCtBt1ALFUZY1gtf9l5g6dSoAMONBktC4ZK+x7NEoJHKSmE5jxoyRq5Djx4+TLsz7779fWFgoex279kTa2tq0tbVJQIfU1NSuzuDdqs1MdlVGSjnSUUukcuQNRYEG1i2qmxNRzL36tSjmjb5gwYJ79+65u7vfvn178uTJX375pcIKXLx4saOjY8aMGaCoM3hXZVg6lSurcWgagMMZJaHcfzaqMyLS3avlciRnopg3+qZNm3g83tmzZ7OyskQi0YYNG177oG5pa2tbt27d6NGjQ0NDQVFn8K7KKMupHEFUgbJsG7zuv4RQKHR2dh48eDAddS40NHTixIkk/uW8efMAYMOGDQKBICkpiUSjOnPmjEgk4vF4Ojo65eXl5C4yEKDj6x06dGjMmDHyFjJgwID6+nqKotrb2wcOHEjmOEnol9OnT/ekPwDY2NjQEtJxsLW1LSoqIpKWlhY7OzsAWLZs2VdffbV+/Xo3NzcyIWpjYwMAdOBM0oEiandVRko50sGJVUQW3mAv3p7cqyl5HMmV4o0OAH/5y1927NixaNGi2bNnl5SUUFJd1K9evbps2TJidqdOneru7j5nzpwPP/wwLS1N4tSPbp3BpfuPd6tMT07l0kEjgsjCG2xElIJ6vdE1HDQiiCy8c9veEQTRZN48I/ImeqMjyFvMm2RE3mhvdAR5W3mTjIienh590ldGRsaECRPUrRGiuQgEgoSEhOzsbBcXFw6H4+zsTOawCQUFBR4eHhwOZ+zYsarfoTd16lROF8i2SYqiDh8+PGfOnM8++2zatGkhISHEv0yC1NRUeueuSCSKiooi/1zVg7ImVwAnvTSA3p5YVW9gF9nb2KVLl/z9/dva2iiKItuFACA4OJiZh2yYLi4uVkwZhbl//76Li8vu3bsP/sGqVatGjhxJrv7rX/+CP07ku3//PgB4e3tLlHDz5k0SwJmW1NXVzZ8/X/Zwze/66gwihV41IiUlJa6urmosRMY2VlRUZG1tXVdXx7yRHHN77NgxWkiOrSOGRpUcPXr02bNnTMknn3yydetW8pv0r8mKvlgsNjEx0dPTY2aur69fv3498yhPwr1795ydnSU2HPQErs4gakDDA7vQiMXigICApUuXGhsbM+XZ2dnm5uYrVqwoKSkhEuKfyTxoTjX4+fmZmJjQyba2tm+++YYcCQwAgwYNAgBy0oVQKKyvr58+fTqdmaKobdu28fn8rl6ILi4uPB6Pz+f3tv5dQSPyLqI5gV0Ui+EihVOnTt29e3fWrFkScgsLi5ycHKFQ6OfnRx8t/Np3Qr0uFgz7sC9nz561srIaPnw4Se7Zs8fe3j4sLKy8vDwtLY3P52dlZdGZU1NTfX19e3I38/DwOHDgAJlbUSnK6tIADmc0AFm6qRoV2OW1MVyYyNLG/Pz84A9/AuaN5EdSUhIAREZGSsh7eif19fXSY8EoFvaFyaJFi/75z38yJbW1tRMnThw8eHB4eDhT/uOPPyYmJpLf3W65vHPnDgDQiw9SwDkRpEdkaRzr1q0DANqDiaKoQ4cOAQCfz6fkCafg4OAAAM3NzSRJ9vL7+vrKVQhFUbQb1GuRpY3Z2NgYGBh0vZH8EIvFZOBAZi5pufR3wpyAEIvFpqamffv2pSiq26gceXl5MlaHoiihUKinp0f7XhHKyspmz55NOlP/93//19nZSVFUXV3dsmXLyG+qByNSWVkJACQqhXRwTgRhxfXr1wFAX1+flhAHa+Yx0bJAYjuQ/9IAMHfuXAB49OiRvPooEAVKCtXV1cTxsls4HE5GRoajo2NgYGBVVRUtl/5OmBMQHA7HyMiIDIhu3brVNeyLjIGjCKdPnx4yZIiTkxMt+emnn95///3AwMBvv/124sSJCQkJmzZtAoCQkJCAgACBQFBcXFxcXExc1YuLi5mDF0NDQ+hyzLAKQCPyzqFRgV2UjpaWlvTAK/r6+rm5uS0tLYsXL6aFir0TlmFfACA7O5ueUiV89tlnz58///vf/96vX79jx44BwH/+8x8AOHXq1PTp04f/AVF1+PDhHh4e9L3E2FF/xL5QGWhE3jk0KrCL9DIVwMLC4sWLF0wJ+aqZ37aTk1NGRgZZASFIfyc9wTLsS3Nzc35+/sKFC5lC0scha0bW1tampqbkZdL+7gR6OPO///2PvpfMjltYWMiogNJQ1rgIcE5EA5BlrKtRgV2kx3CRQJY2RiI2NDU10RIybKmsrJTIGRYWRr8r6e+kp1gwUsK+7N69e/jw4VlZWVJUzczMdHR0pIslkGP6yI2kuxEaGtr13m7nRH755RfAiVWEJTI2Ds0J7CIlhktXZGljpH9x9uxZkszNzfX09ASA2bNnX7lyhZmzvb2dxPeV/k6kx4LpKexLSEgIh8OxtLSUourcuXM3btwoIRSLxWlpaX/9618jIiLmzZu3cePGlpaWrvd2a0T27dvH5XJl2beKRgTpEVXGE1F9YBcZ25inp+fatWtVoI90iCVV5RO9vLyWL18uS05cnUEQaRw8eDA/P7+6ulqNOgiFwpSUFIlDP3qVwsJCgUCglpMY0YggCqKxgV3MzMxyc3PDw8Ml1k1USUlJSVxc3MiRI1XzuMrKytjY2IKCgoEDB6rmiUzQiCByo/mBXUaNGhUbG0smKdXCyJEjVfY9d3R0HDlyJCsrS13r66o7AQ95ayCBXeLi4tStiDTs7e2joqLUrYUq0NbWjomJUaMC2BNBEIQVaEQQBGEFGhEEQViBRgRBEFZwKCW563A4nL/97W9q9796x3ny5MmNGzck3DHeGo4fP45tTCmQdqK0b19ZBUVERKgz3jSCIPJgZWVFQjSxR2lGBEGQdxOcE0EQhBVoRBAEYQUaEQRBWIFGBEEQVvw/vdz/nr2lGO8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "decoder_input = keras.Input((code_dim,))\n",
    "decoder_output = auto_encoder.layers[-1](decoder_input)\n",
    "decoder = keras.Model(decoder_input, decoder_output)\n",
    "keras.utils.plot_model(decoder, show_shapes=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "auto_encoder.compile(optimizer='adam',\n",
    "                    loss='binary_crossentropy')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 54000 samples, validate on 6000 samples\n",
      "Epoch 1/100\n",
      "54000/54000 [==============================] - 3s 60us/sample - loss: 0.7063 - val_loss: 0.6794\n",
      "Epoch 2/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6794 - val_loss: 0.6742\n",
      "Epoch 3/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6767 - val_loss: 0.6729\n",
      "Epoch 4/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6758 - val_loss: 0.6726\n",
      "Epoch 5/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6753 - val_loss: 0.6721\n",
      "Epoch 6/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6750 - val_loss: 0.6719\n",
      "Epoch 7/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6747 - val_loss: 0.6717\n",
      "Epoch 8/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6746 - val_loss: 0.6716\n",
      "Epoch 9/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6744 - val_loss: 0.6716\n",
      "Epoch 10/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6743 - val_loss: 0.6714\n",
      "Epoch 11/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6742 - val_loss: 0.6713\n",
      "Epoch 12/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6741 - val_loss: 0.6713\n",
      "Epoch 13/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6740 - val_loss: 0.6711\n",
      "Epoch 14/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6739 - val_loss: 0.6711\n",
      "Epoch 15/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6738 - val_loss: 0.6710\n",
      "Epoch 16/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6738 - val_loss: 0.6709\n",
      "Epoch 17/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6737 - val_loss: 0.6709\n",
      "Epoch 18/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6736 - val_loss: 0.6708\n",
      "Epoch 19/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6736 - val_loss: 0.6707\n",
      "Epoch 20/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6735 - val_loss: 0.6706\n",
      "Epoch 21/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6735 - val_loss: 0.6705\n",
      "Epoch 22/100\n",
      "54000/54000 [==============================] - 3s 53us/sample - loss: 0.6734 - val_loss: 0.6705\n",
      "Epoch 23/100\n",
      "54000/54000 [==============================] - 3s 61us/sample - loss: 0.6734 - val_loss: 0.6705\n",
      "Epoch 24/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6733 - val_loss: 0.6705\n",
      "Epoch 25/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6733 - val_loss: 0.6705\n",
      "Epoch 26/100\n",
      "54000/54000 [==============================] - 3s 51us/sample - loss: 0.6732 - val_loss: 0.6704\n",
      "Epoch 27/100\n",
      "54000/54000 [==============================] - 3s 55us/sample - loss: 0.6732 - val_loss: 0.6704\n",
      "Epoch 28/100\n",
      "54000/54000 [==============================] - 4s 67us/sample - loss: 0.6732 - val_loss: 0.6702\n",
      "Epoch 29/100\n",
      "54000/54000 [==============================] - 3s 64us/sample - loss: 0.6731 - val_loss: 0.6703\n",
      "Epoch 30/100\n",
      "54000/54000 [==============================] - 3s 53us/sample - loss: 0.6731 - val_loss: 0.6702\n",
      "Epoch 31/100\n",
      "54000/54000 [==============================] - 3s 59us/sample - loss: 0.6730 - val_loss: 0.6702\n",
      "Epoch 32/100\n",
      "54000/54000 [==============================] - 3s 62us/sample - loss: 0.6730 - val_loss: 0.6701\n",
      "Epoch 33/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6730 - val_loss: 0.6701\n",
      "Epoch 34/100\n",
      "54000/54000 [==============================] - 3s 55us/sample - loss: 0.6729 - val_loss: 0.6702\n",
      "Epoch 35/100\n",
      "54000/54000 [==============================] - 3s 58us/sample - loss: 0.6729 - val_loss: 0.6701\n",
      "Epoch 36/100\n",
      "54000/54000 [==============================] - 3s 53us/sample - loss: 0.6729 - val_loss: 0.6700\n",
      "Epoch 37/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6729 - val_loss: 0.6701\n",
      "Epoch 38/100\n",
      "54000/54000 [==============================] - 3s 50us/sample - loss: 0.6728 - val_loss: 0.6700\n",
      "Epoch 39/100\n",
      "54000/54000 [==============================] - 3s 50us/sample - loss: 0.6728 - val_loss: 0.6698\n",
      "Epoch 40/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6728 - val_loss: 0.6700\n",
      "Epoch 41/100\n",
      "54000/54000 [==============================] - 3s 50us/sample - loss: 0.6727 - val_loss: 0.6699\n",
      "Epoch 42/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6727 - val_loss: 0.6699\n",
      "Epoch 43/100\n",
      "54000/54000 [==============================] - 3s 60us/sample - loss: 0.6727 - val_loss: 0.6699\n",
      "Epoch 44/100\n",
      "54000/54000 [==============================] - 4s 80us/sample - loss: 0.6726 - val_loss: 0.6700\n",
      "Epoch 45/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6726 - val_loss: 0.6698\n",
      "Epoch 46/100\n",
      "54000/54000 [==============================] - 3s 57us/sample - loss: 0.6726 - val_loss: 0.6699\n",
      "Epoch 47/100\n",
      "54000/54000 [==============================] - 3s 46us/sample - loss: 0.6726 - val_loss: 0.6697\n",
      "Epoch 48/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6725 - val_loss: 0.6697\n",
      "Epoch 49/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6725 - val_loss: 0.6697\n",
      "Epoch 50/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6725 - val_loss: 0.6696\n",
      "Epoch 51/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6725 - val_loss: 0.6697\n",
      "Epoch 52/100\n",
      "54000/54000 [==============================] - 3s 46us/sample - loss: 0.6724 - val_loss: 0.6696\n",
      "Epoch 53/100\n",
      "54000/54000 [==============================] - 3s 46us/sample - loss: 0.6724 - val_loss: 0.6697\n",
      "Epoch 54/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6724 - val_loss: 0.6696\n",
      "Epoch 55/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6724 - val_loss: 0.6697\n",
      "Epoch 56/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6724 - val_loss: 0.6695\n",
      "Epoch 57/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6723 - val_loss: 0.6696\n",
      "Epoch 58/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6723 - val_loss: 0.6695\n",
      "Epoch 59/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6723 - val_loss: 0.6695\n",
      "Epoch 60/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6723 - val_loss: 0.6695\n",
      "Epoch 61/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6723 - val_loss: 0.6696\n",
      "Epoch 62/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6723 - val_loss: 0.6695\n",
      "Epoch 63/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6722 - val_loss: 0.6694\n",
      "Epoch 64/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6722 - val_loss: 0.6694\n",
      "Epoch 65/100\n",
      "54000/54000 [==============================] - 3s 47us/sample - loss: 0.6722 - val_loss: 0.6694\n",
      "Epoch 66/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6722 - val_loss: 0.6694\n",
      "Epoch 67/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6722 - val_loss: 0.6694\n",
      "Epoch 68/100\n",
      "54000/54000 [==============================] - 3s 52us/sample - loss: 0.6721 - val_loss: 0.6694\n",
      "Epoch 69/100\n",
      "54000/54000 [==============================] - 3s 52us/sample - loss: 0.6721 - val_loss: 0.6693\n",
      "Epoch 70/100\n",
      "54000/54000 [==============================] - 3s 51us/sample - loss: 0.6721 - val_loss: 0.6693\n",
      "Epoch 71/100\n",
      "54000/54000 [==============================] - 3s 51us/sample - loss: 0.6721 - val_loss: 0.6693\n",
      "Epoch 72/100\n",
      "54000/54000 [==============================] - 3s 52us/sample - loss: 0.6721 - val_loss: 0.6693\n",
      "Epoch 73/100\n",
      "54000/54000 [==============================] - 3s 53us/sample - loss: 0.6721 - val_loss: 0.6693\n",
      "Epoch 74/100\n",
      "54000/54000 [==============================] - 3s 51us/sample - loss: 0.6720 - val_loss: 0.6694\n",
      "Epoch 75/100\n",
      "54000/54000 [==============================] - 3s 51us/sample - loss: 0.6720 - val_loss: 0.6693\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 76/100\n",
      "54000/54000 [==============================] - 2s 43us/sample - loss: 0.6720 - val_loss: 0.6693\n",
      "Epoch 77/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6720 - val_loss: 0.6692\n",
      "Epoch 78/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6720 - val_loss: 0.6693\n",
      "Epoch 79/100\n",
      "54000/54000 [==============================] - 3s 48us/sample - loss: 0.6720 - val_loss: 0.6692\n",
      "Epoch 80/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6719 - val_loss: 0.6691\n",
      "Epoch 81/100\n",
      "54000/54000 [==============================] - 3s 51us/sample - loss: 0.6719 - val_loss: 0.6693\n",
      "Epoch 82/100\n",
      "54000/54000 [==============================] - 3s 49us/sample - loss: 0.6719 - val_loss: 0.6692\n",
      "Epoch 83/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6719 - val_loss: 0.6692\n",
      "Epoch 84/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6719 - val_loss: 0.6692\n",
      "Epoch 85/100\n",
      "54000/54000 [==============================] - 2s 43us/sample - loss: 0.6719 - val_loss: 0.6692\n",
      "Epoch 86/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6719 - val_loss: 0.6692\n",
      "Epoch 87/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6718 - val_loss: 0.6692\n",
      "Epoch 88/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6718 - val_loss: 0.6691\n",
      "Epoch 89/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6718 - val_loss: 0.6692\n",
      "Epoch 90/100\n",
      "54000/54000 [==============================] - 2s 43us/sample - loss: 0.6718 - val_loss: 0.6690\n",
      "Epoch 91/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6718 - val_loss: 0.6689\n",
      "Epoch 92/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6717 - val_loss: 0.6690\n",
      "Epoch 93/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6717 - val_loss: 0.6689\n",
      "Epoch 94/100\n",
      "54000/54000 [==============================] - 2s 44us/sample - loss: 0.6717 - val_loss: 0.6689\n",
      "Epoch 95/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6716 - val_loss: 0.6689\n",
      "Epoch 96/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6716 - val_loss: 0.6689\n",
      "Epoch 97/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6716 - val_loss: 0.6687\n",
      "Epoch 98/100\n",
      "54000/54000 [==============================] - 2s 46us/sample - loss: 0.6716 - val_loss: 0.6687\n",
      "Epoch 99/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6716 - val_loss: 0.6688\n",
      "Epoch 100/100\n",
      "54000/54000 [==============================] - 2s 45us/sample - loss: 0.6715 - val_loss: 0.6688\n",
      "CPU times: user 6min 53s, sys: 23.2 s, total: 7min 16s\n",
      "Wall time: 4min 24s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history = auto_encoder.fit(x_train, x_train, batch_size=64, epochs=100, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "encoded = encoder.predict(x_test)\n",
    "decoded = decoder.predict(encoded)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x400 with 0 Axes>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.figure(figsize=(10,4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 10 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 5\n",
    "for i in range(n):\n",
    "    ax = plt.subplot(2, n, i+1)\n",
    "    plt.imshow(x_test[i].reshape(28,28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    \n",
    "    ax = plt.subplot(2, n, n+i+1)\n",
    "    plt.imshow(decoded[i].reshape(28,28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
